package com.zxy.service.impl;



import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxy.mapper.SysMenuMapper;
import com.zxy.pojo.dto.MenuQueryDTO;
import com.zxy.pojo.entity.SysMenu;
import com.zxy.pojo.vo.SysMenuVO;
import com.zxy.service.SysMenuService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 菜单Service实现类
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    @Resource
    private SysMenuMapper sysMenuMapper;

    /**
     * 无分页查询树形菜单列表
     */
    @Override
    public List<SysMenuVO> getMenuTreeList(MenuQueryDTO query) {
        // 1. 查询所有符合条件的菜单（无分页）
        List<SysMenuVO> allMenuVoList = sysMenuMapper.selectMenuList(query);
        // 2. 构建树形结构并返回
        return buildMenuTree(allMenuVoList);
    }

    /**
     * 构建菜单树形结构（核心逻辑）
     */
    @Override
    public List<SysMenuVO> buildMenuTree(List<SysMenuVO> menuVoList) {
        // 1. 筛选顶级菜单（parentId=0，处理null安全）
        List<SysMenuVO> topMenuVoList = menuVoList.stream()
                .filter(menuVo -> Objects.nonNull(menuVo.getParentId()) && Objects.equals(menuVo.getParentId(), 0L))
                .collect(Collectors.toList());

        // 2. 为每个顶级菜单递归设置子菜单
        for (SysMenuVO topMenuVo : topMenuVoList) {
            setChildrenMenu(topMenuVo, menuVoList);
        }

        return topMenuVoList;
    }

    /**
     * 递归设置子菜单（处理null安全，避免空指针）
     * @param parentMenuVo 父菜单VO
     * @param allMenuVoList 所有菜单VO列表
     */
    private void setChildrenMenu(SysMenuVO parentMenuVo, List<SysMenuVO> allMenuVoList) {
        // 1. 获取父菜单ID，若为null直接返回空列表
        Long parentMenuId = parentMenuVo.getMenuId();
        if (Objects.isNull(parentMenuId)) {
            parentMenuVo.setChildren(List.of());
            return;
        }

        // 2. 筛选当前父菜单的子菜单（parentId = 父菜单ID）
        List<SysMenuVO> childrenMenuVoList = allMenuVoList.stream()
                .filter(menuVo -> Objects.nonNull(menuVo.getParentId()) && Objects.equals(menuVo.getParentId(), parentMenuId))
                .collect(Collectors.toList());

        // 3. 递归设置子菜单的子菜单
        if (!childrenMenuVoList.isEmpty()) {
            parentMenuVo.setChildren(childrenMenuVoList);
            for (SysMenuVO childMenuVo : childrenMenuVoList) {
                setChildrenMenu(childMenuVo, allMenuVoList);
            }
        } else {
            // 无子孙菜单时，设为空列表（符合前端格式，避免null）
            parentMenuVo.setChildren(List.of());
        }
    }

    /**
     * 递归查询子菜单（备用方法，可用于单独获取子菜单）
     */
    @Override
    public List<SysMenuVO> getChildrenMenuList(Long parentId) {
        return sysMenuMapper.selectChildrenMenuById(parentId);
    }
}
